home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
graphics
/
degas2ps.arc
/
DEGAS2PS.C01
< prev
next >
Wrap
Text File
|
1989-06-20
|
32KB
|
1,072 lines
/*******************************************************************/
/* */
/* DEGAS2PS.PRG */
/* Programme d'impression d'images provenant de DEGAS (.PI3). */
/* La sortie se fait en PostScript vers un fichier ou une laser. */
/* Il est possible de sélectionner une partie de l'image, */
/* la réduction ou l'augmentation ainsi que la position sur */
/* la page. */
/* IRISA de RENNES */
/* */
/* Matériels : ATARI 1040 STFM + LaserWriter II NT */
/* Langage : Megamax C */
/* */
/* ecrit par : Bertrand DECOUTY (IRISA-INRIA, Rennes) */
/* Philippe LE THOMAS (stage IUT Lannion 1988) */
/* */
/*******************************************************************/
char version[]= "DEGAS2PS 1.52";
/* 1= francais, 0= anglais */
#define FRANCAIS 0
#include <stdio.h>
#include <osbind.h>
#include <gembind.h>
#include <gemdefs.h>
#include <obdefs.h>
#include <string.h>
#include "DEGAS2PS.H"
#define RESSOURCE "DEGAS2PS.RSC"
#if FRANCAIS
#define MESS0 "[3][ | Le fichier ressource | est introuvable... ][ STOP ]"
#define MESS1 "[2][ | Le périphérique n'est | pas connecté... ][ OK | ANNULER ]"
#define MESS2 "[3][ | Erreur lors de l'ouverture | du fichier de sortie... ][ STOP ]"
#define MESS3 "[2][ | Voulez-vous réellement | stopper l'impression ? ][ NON | OUI ]"
#define MESS4 "[3][ Erreur d'écriture | du fichier PostScript ...| disque plein ? ][ STOP ]"
#define MESS5 "[3][ | Erreur lors de l'ouverture | du fichier image... ][ STOP ]"
#else /* messages en anglais */
#define MESS0 "[3][ | Resource file | not found... ][ STOP ]"
#define MESS1 "[2][ | Peripheral device | not connected or off-line... ][ OK | CANCEL ]"
#define MESS2 "[3][ | I can't open | output file... ][ STOP ]"
#define MESS3 "[2][ | Do you really want | to stop printing ? ][ NO | YES ]"
#define MESS4 "[3][ I/O ERROR while | writing PostScript file | disk full ?][ Sorry.. ]"
#define MESS5 "[3][ | I can't open | image file... ][ STOP ]"
#endif
#define void /**/
#define VRAI 1
#define FAUX 0
#define RESW 639 /* Largeur maximale de l'écran */
#define RESH 399 /* Hauteur maximale de l'écran */
#define Souris_Croix graf_mouse(5,&dummy)
#define Souris_Normale graf_mouse(0,&dummy)
#define Cache_Souris graf_mouse(256,&dummy)
#define Montre_Souris graf_mouse(257,&dummy)
/* structure pour informations sur fichier */
/*
typedef struct {
long b_free;
long b_total;
long b_secsiz;
long b_clsiz;
} disk_info;
*/
/* variables utilisées par le GEM */
int work_in[12],work_out[57],contrl[12],intin[256],intout[256],
ptsin[128],ptsout[128];
/* variables globales */
int periph; /* indique le peripherique de sortie : 0 = centronics (PRT:) */
/* 1 = RS 232 (AUX:) */
/* 2 = fichier (file.PS) */
int handle,x,y,w,h,xres,yres,nombre,sortie,
xsouris,ysouris,etatbout,etatclav,codeclav,nbpress,event,
xdial,ydial,wdial,hdial,test,mgbuf[11],debut,lon,
xstart,ystart,width,height,xso,yso,swo,sho,ouvert,
rx,ry,rw,rh,dummy,boxw,boxh,deja,sw,sh,suppl,
w_handle,wx,wy,wh,ww,lecture,ecriture,
dfbb[10],dfbs[10],frmary[8],clpry[4],fin;
long buffer,ecran;
char source[80],tex[4][80],mode[80],cheminlecture[80],
cheminecriture[80],nomfenetre[50],nomsortie[30];
OBJECT *barre,*dial;
/**************************************************************************/
/* initialisation des tableaux contenant les coordonnées des */
/* blocs pour le clipping */
void init()
{
xres = work_out[0]+1;
yres = work_out[1]+1;
vq_extnd(handle,1,work_out);
dfbb[0]=(ecran+34)>>16;
dfbb[1]=(ecran+34)&0xffff;
dfbb[2]=xres;
dfbb[3]=yres;
dfbb[4]=xres>>4;
dfbb[5]=0;
dfbb[6]=work_out[4];
dfbs[0]=dfbs[1]=0;
ouvert = lecture = ecriture = FAUX;
/* lecture des coordonnées maximales de la fenetre */
wind_get(0,WF_WORKXYWH,&wx,&wy,&ww,&wh);
buffer = Malloc((long)32000+256+256);
w_handle = wind_create(NAME,wx,wy,ww,wh);
}
/**************************************************************************/
void main()
{
int i;
register int boucle;
/* Initialisation des variables utilisées par le système */
for (boucle=1; boucle<10; work_in[boucle++]=1);
work_in[10]=2;
appl_init();
Cache_Souris;
/* ouverture de la station de travail virtuelle */
handle = graf_handle(&i,&i,&i,&i);
v_opnvwk(work_in,&handle,work_out);
init();
Montre_Souris;
/* chargement du fichier ressource contenant le menu, */
/* les boites de dialogue et les différentes icones */
if (!rsrc_load(RESSOURCE))
{
form_alert(1,MESS0);
}
else
{
/* affichage du menu et lecture de son adresse dans l'arbre */
Souris_Normale;
rsrc_gaddr(R_TREE,MENU,&barre);
edition();
}
quitter();
}
/**************************************************************************/
/* fermeture de la station, de le fenetre et liberation de la */
/* memoire */
void quitter()
{
menu_bar(barre,FAUX);
/* on libère la mémoire occupée par l'image */
Mfree(buffer);
if (ouvert)
{
/* effacement de la fenetre */
wind_close(w_handle);
wind_delete(w_handle);
}
v_clsvwk(handle);
Souris_Normale;
Montre_Souris;
appl_exit();
}
/**************************************************************************/
/* routine de copie de bloc */
/* drap : 1 = copie sans changement, 0 = inversion video */
void image(sx,sy,dx,dy,l,h,drap)
register int sx,sy,dx,dy,l,h,drap;
{
frmary[0]=sx;
frmary[1]=sy;
frmary[2]=sx+l-1;
frmary[3]=sy+h-1;
frmary[4]=dx;
frmary[5]=dy;
frmary[6]=dx+l-1;
frmary[7]=dy+h-1;
clpry[0]=dx;
clpry[1]=dy;
clpry[2]=dx+l-1;
clpry[3]=dy+h-1;
vs_clip(handle,1,clpry);
Cache_Souris;
if (drap)
vro_cpyfm(handle,3,frmary,dfbb,dfbs);
else
vro_cpyfm(handle,12,frmary,dfbb,dfbs);
Montre_Souris;
}
/**************************************************************************/
/* attend un appui sur le bouton gauche pour renvoyer les coordonnées */
/* de la souris, si bouton droit => on quitte. Un appui sur ALTERNATE */
/* réinitialise l'ecran */
void gestion()
{
int bouton,key;
Souris_Croix;
undo();
do
{
event = evnt_mouse(0,0,0,RESW,RESH,&xsouris,&ysouris,&bouton,&key);
/* test le bouton gauche */
if (bouton & 0x0001) souris();
/* test la touche ALT */
if (key & 0x0008) undo();
}
/* test le bouton droit */
while (!(bouton & 0x0002));
Souris_Normale;
}
/**************************************************************************/
/* restitution de l'écran original */
void undo()
{
deja = FAUX;
sho = 400; swo = 640;
image(0,0,0,0,RESW+1,RESH+1,VRAI);
}
/**************************************************************************/
/* affichage d'un rectangle de sélection pour indiquer la zone */
/* que l'on désire imprimer */
void souris()
{
int status,x,y,xx,yy,xd,yd;
char message[80],texte[50];
undo();
deja = VRAI;
xx = x = 0; yy = y = 0;
xd = xsouris;
yd = ysouris;
Cconout(0x07);
do
{
vq_mouse(handle,&status,&x,&y);
if ((xx != x) || (yy != y))
{
image(xd,yd,xd,yd,xx-xd+1,yy-yd+1,VRAI);
image(xd,yd,xd,yd,x-xd+1,y-yd+1,FAUX);
xx = x; yy = y;
}
}
while ((status & 0x0001));
/* form_alert(1,MESS6);*/
Souris_Croix;
if (xd <= x) { xso = xd;swo = x - xso; }
else { xso = x;swo = xd - xso; }
if (yd <= y) { yso = yd;sho = y - yso; }
else { yso = y;sho = yd - yso; }
}
/**************************************************************************/
/* gestion des évènements : menu, raffraichissement écran */
void edition()
{
int xstart,ystart,wstart,hstart,rx,ry,rh,rw;
Souris_Normale;
menu_ienable(barre,IMPRIMER,FAUX);
menu_ienable(barre,EDITER,FAUX);
menu_bar(barre,VRAI);
while (fin != 1)
{
event = evnt_mesag(mgbuf);
wind_update(VRAI);
switch (mgbuf[0])
{
/* un menu a ete selectionne */
case MN_SELECTED : selection();
break;
/* rafraichissement de la fenetre */
case WM_REDRAW :
wind_get(mgbuf[3],WF_WORKXYWH,&xsta